package org.dreamwork.cai.annotation;

import java.lang.annotation.*;

/**
 * 发现本地提供的 RemoteService.
 */
@Target ({ElementType.TYPE})
@Retention (RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ARemoteServiceDiscoverer {
    /**
     * 本地提供程序在服务器测注册的命名空间
     * @return 命名空间，如果不填，默认为标注类的包名
     */
    String namespace () default "";

    /**
     * 需要扫描的包
     *
     * @return 包名，如果不填，默认为标注类的包名
     */
    String[] scanBasePackages() default {};

    /**
     * 是否允许自动注入远程服务
     * @return 是否允许自动注入远程服务
     */
    boolean autowireRemoteServices () default false;

    /**
     * 是否在本地创建远程服务的存根
     * @return 若是，则在本地创建存根，代码中可以象使用类似调用本地服务的方式进行调用；否则需要通过包装调用
     * @see org.dreamwork.cai.core.IRemoteServices#call(String, String, String, Object...) IRemoteService.call
     * @see org.dreamwork.cai.core.IRemoteServices#lookup(String, String) IRemoteService.lookup(String, String)
     */
    boolean buildLocalStub () default true;

    /**
     * 忽略的 srf 列表.
     * <p>一旦忽略了某个 srf，框架不会尝试在本地构建服务存根，也不会发出本地广播 </p>
     * <p>如果需要忽略所有的 srf，请使用 {@link #buildLocalStub()} 属性</p>
     * @return 需要忽略的 srf 列表
     */
    String[] ignores () default {};

    /**
     * 必须的 srf 列表.
     *
     * <p>如果一个 srf namespace 出现在该列表中，框架将在本地构建远程服务存根</p>
     * <p>若一个 srf namespace <strong>同时</strong>出现在该属性和 {@link #ignores()} 属性中，以该属性为准</p>
     * <p>默认值 {@code {}} 表示所有 srf 都需要在本地构建远程服务存根</p>
     * @return 需要在本地构建远程服务存根的 srf 列表
     */
    String[] requires () default {};

//    /**
//     * CAI Router 的配置信息
//     * @return CAI Router 的配置信息
//     */
//    ARouter router ();
}